<?php

/**
 * Qual类
 *
 * 功能：查询资格
 *
 * @version 1.0.0 2019/03/27
 * @since
 *
 */

namespace Lib\Paas;

use Lib\Base\Validate;

class Qual extends Base
{
    public function __construct($sData = [])
    {
        parent::__construct($sData);
    }

    /**
     * 查询资格剩余情况（支持批量查询）
     * @param array $qualInfo 【必填】 =
     * [
     *    'qualkey1' => '资格总数',
     *    'qualkey2' => '资格总数',
     *    ...,
     *    'sGameOpenid' => '【选填】，默认不需要传递，自动查询当前登录态中的openid的资格信息。如果要查询非当前登录账号的资格情况，可以通过该参数查询指定openid的账号资格信息'
     *]
     * 注意：qualkey 不需要传递openid，paas接口会自动拼接当前登录态中的openid到key上
     * @return array
     * [
     *      'iRet' => '0-成功，其他失败',
     *      'sMsg' => '接口返回的信息',
     *      'sPaasSerial' => '流水号',
     *      'data' => [
     *          'qualkey1' => [
     *              'type' => 'DB_VALID_QUAL(有效)|DB_EXPIRE_QUAL(过期)|DB_NO_USERQUAL(无记录)|ERROR_HOLD_QRYRUL(查询失败)'
     *              'iTotalNum' => '总资格数',
     *              'iLeftNum' => '剩余资格数',
     *              'iUsedNum' => '已经使用的资格数',
     *              'iFrozenNum' => '被冻结的资格数'
     *          ],
     *          'qualkey2' => ['参考qualkey1结果'],
     *          ...
     *      ]
     * ]
     * 注意：iRet = 0 表示所有资格都查询均成功，iRet != 0 表示本次查询失败
     */
    public function query($qualInfo)
    {
        $paasParam = array();

        //sGameOpenid 参数以get方式传递
        if (isset($qualInfo['sGameOpenid'])) {
            if (!Validate::checkUin($qualInfo['sGameOpenid'])) {
                return $this->getRetData('-1000400', '要查询的账号错误！');
            }
            $paasParam['sGameOpenid'] = $qualInfo['sGameOpenid'];
            unset($qualInfo['sGameOpenid']);
        }

        //组合URL
        $url = $this->getPaasRequestUrl('qual.query', $paasParam);
        $res = $this->http->post($url, json_encode($qualInfo));
        recordLog("qual query result：" . var_export($res, true), __FILE__, __LINE__);

        if ($res['ret'] != 0) {
            $this->tglogReport('框架请求ULink-Paas出现异常，curl_errno：' . $res['ret'] . '，curl_error：' . $res['msg'], 'qual.query');
            return $this->getRetData(CURL_ERROR_NO, '系统繁忙，请稍后再试！');
        }
        $res = $res['data'];
        return $this->getQualRetData($qualInfo, $res);
    }

    /**
     * 查询资格使用情况
     * @param array $qualInfo  【必填】流程资格信息
     * $qualInfo =
     * [
     *    'qualkey1' => '资格总数',
     *    'qualkey2' => '资格总数',
     *    ...,
     *    'sGameOpenid' => '【选填】，默认不需要传递，自动查询当前登录态中的openid的资格信息。如果要查询非当前登录账号的资格情况，可以通过该参数查询指定openid的账号资格信息'
     *]
     * 注意：qualkey 不需要传递openid，paas接口会自动拼接当前登录态中的openid到key上
     *
     * @param array $pubQualInfo 【选填】公有资格信息
     * $pubQualInfo =
     * [
     *    'pubQualInfokey1' => '资格总数',
     *    'pubQualInfokey2' => '资格总数',
     *    ...,
     * ]
     *
     * @return array
     * [
     *      'iRet' => '0-成功，其他失败',
     *      'sMsg' => '接口返回的信息',
     *      'sPaasSerial' => '流水号',
     *      'data' => [
     *          'qualkey1' => [
     *              'type' => 'DB_VALID_QUAL(有效)|DB_EXPIRE_QUAL(过期)|DB_NO_USERQUAL(无记录)|ERROR_HOLD_QRYRUL(查询失败)'
     *              'iTotalNum' => '总资格数',
     *              'iLeftNum' => '剩余资格数',
     *              'iUsedNum' => '已经使用的资格数',
     *              'iFrozenNum' => '被冻结的资格数'
     *          ],
     *          'qualkey2' => ['参考qualkey1结果'],
     *          ...
     *          ['pubQualkey1'] => ['参考qualkey1结果'],
     *          ...
     *      ]
     * ]
     * 注意：iRet = 0 表示所有资格都查询均成功，iRet != 0 表示本次查询失败
     */
    public function batchQualQuery($qualInfo, $pubQualInfo = null)
    {
        $paasParam = array();

        //sGameOpenid 参数以get方式传递
        if (isset($qualInfo['sGameOpenid'])) {
            if (!Validate::checkUin($qualInfo['sGameOpenid'])) {
                return $this->getRetData('-1000401', '要查询的账号错误！');
            }
            $paasParam['sGameOpenid'] = $qualInfo['sGameOpenid'];
            unset($qualInfo['sGameOpenid']);
        }

        $qualInfoKeys = [];
        $pubQualInfoKeys = [];

        if (!empty($qualInfo)) {
            $qualInfoKeys = array_keys($qualInfo);
        }

        if (!is_null($pubQualInfo)) {
            $pubQualInfoKeys = array_keys($pubQualInfo);
        }

        $keys = array_merge($qualInfoKeys, $pubQualInfoKeys);
        if (count(array_unique($keys)) != count($keys)) {
            return $this->getRetData('-1000400', '公有资格key和单流程资格key不能重复！');
        }

        $postData = [];
        if (!empty($qualInfo)) {
            $postData['qual'] = $qualInfo;
        }

        if (!empty($pubQualInfo)) {
            $postData['pubQual'] = $pubQualInfo;
        }

        if (empty($postData)) {
            return $this->getRetData('-1000401', '要查询的资格key不能为空！');
        }

        $url = $this->getPaasRequestUrl('qual.batchquery', $paasParam);
        $res = $this->http->post($url, json_encode($postData));
        recordLog("qual batch query result：" . \var_export($res, true), __FILE__, __LINE__);

        if ($res['ret'] != 0) {
            $this->tglogReport('框架请求ULink-Paas出现异常，curl_errno：' . $res['ret'] . '，curl_error：' . $res['msg'], 'qual.batchquery');
            return $this->getRetData(CURL_ERROR_NO, '系统繁忙，请稍后再试！');
        }
        $res = $res['data'];
        $qualInfo = is_null($pubQualInfo) ? $qualInfo : array_merge($qualInfo, $pubQualInfo);
        return $this->getQualRetData($qualInfo, $res);
    }
}
